Jackson হলো Java-তে ব্যবহৃত একটি জনপ্রিয় লাইব্রেরি যা JSON (JavaScript Object Notation) ডেটা প্রসেস করার জন্য ব্যবহৃত হয়। এটি JSON ডেটাকে Java Object এ এবং Java Object কে JSON ডেটায় কনভার্ট করতে সাহায্য করে।
Jackson Annotations হল এমন কিছু সরঞ্জাম যা আমাদের JSON এবং Java Object-এর মধ্যে ডেটা ম্যাপ করার সময় কাস্টমাইজেশন করতে দেয়। নিচে কিছু গুরুত্বপূর্ণ Jackson Annotations ও তাদের ব্যবহার নিয়ে আলোচনা করা হলো:
1. @JsonProperty
- এটি Java ফিল্ড বা মেথডের নাম এবং JSON প্রোপার্টির নামের মধ্যে ম্যাপিং কাস্টমাইজ করার জন্য ব্যবহৃত হয়।
import com.fasterxml.jackson.annotation.JsonProperty;
public class User {
@JsonProperty("user_id")
private int id;
@JsonProperty("user_name")
private String name;
// Getters and Setters
}
JSON Input:
{
"user_id": 1,
"user_name": "John Doe"
}
2. @JsonIgnore
- এটি একটি ফিল্ড বা মেথড JSON সিরিয়ালাইজেশন বা ডেসিরিয়ালাইজেশনে উপেক্ষা করার জন্য ব্যবহৃত হয়।
import com.fasterxml.jackson.annotation.JsonIgnore;
public class User {
private int id;
@JsonIgnore
private String password;
// Getters and Setters
}
JSON Output:
{
"id": 1
}
3. @JsonIgnoreProperties
- এটি ক্লাস লেভেলে ব্যবহৃত হয় একাধিক ফিল্ড JSON প্রসেসিং থেকে উপেক্ষা করার জন্য।
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties({"password", "email"})
public class User {
private int id;
private String name;
private String password;
private String email;
// Getters and Setters
}
JSON Output:
{
"id": 1,
"name": "John Doe"
}
4. @JsonInclude
- এটি ফিল্ডগুলোকে JSON-এ অন্তর্ভুক্ত করার নিয়ম নির্ধারণ করে। যেমন শুধুমাত্র non-null, non-default ইত্যাদি।
import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
private int id;
private String name;
private String email;
// Getters and Setters
}
JSON Output:
{
"id": 1,
"name": "John Doe"
}
5. @JsonFormat
- এটি ডেটা ফরম্যাট কাস্টমাইজ করার জন্য ব্যবহৃত হয়, যেমন তারিখের জন্য।
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
public class Event {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date eventDate;
// Getters and Setters
}
JSON Output:
{
"eventDate": "2024-12-21 10:30:00"
}
6. @JsonCreator
- এটি ডেসিরিয়ালাইজেশনের সময় JSON থেকে একটি কাস্টম কনস্ট্রাক্টর ব্যবহারের জন্য ব্যবহৃত হয়।
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
public class User {
private int id;
private String name;
@JsonCreator
public User(@JsonProperty("id") int id, @JsonProperty("name") String name) {
this.id = id;
this.name = name;
}
// Getters and Setters
}
7. @JsonValue
- এটি একটি মেথড ব্যবহার করে Java Object-এর JSON সিরিয়ালাইজেশন কাস্টমাইজ করে।
import com.fasterxml.jackson.annotation.JsonValue;
public class Status {
private String code;
public Status(String code) {
this.code = code;
}
@JsonValue
public String getCode() {
return code;
}
}
JSON Output:
"ACTIVE"
8. @JsonAnyGetter এবং @JsonAnySetter
- এগুলো ডায়নামিক কী-ভ্যালু পেয়ার প্রসেস করার জন্য ব্যবহৃত হয়।
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import java.util.HashMap;
import java.util.Map;
public class DynamicProperties {
private Map<String, String> properties = new HashMap<>();
@JsonAnySetter
public void add(String key, String value) {
properties.put(key, value);
}
@JsonAnyGetter
public Map<String, String> getProperties() {
return properties;
}
}
JSON Input/Output:
{
"key1": "value1",
"key2": "value2"
}
9. @JsonAutoDetect
- এটি ফিল্ড, গেটারস বা সেটারস ম্যানুয়ালি নির্বাচন ছাড়াই সিরিয়ালাইজ করার জন্য ব্যবহার করা হয়।
import com.fasterxml.jackson.annotation.JsonAutoDetect;
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class User {
private int id;
private String name;
}
JSON Output:
{
"id": 1,
"name": "John Doe"
}
Jackson এর Annotations ব্যবহার করে ডেটা ম্যাপিং এবং ফরম্যাটিং অনেক সহজ এবং কাস্টমাইজ করা যায়। প্রতিটি Annotation ব্যবহারিক উদাহরণ ও প্রয়োজনীয়তার উপর ভিত্তি করে নির্বাচন করতে হয়।
@JsonProperty এবং @JsonIgnore হলো Jackson লাইব্রেরির দুটি গুরুত্বপূর্ণ অ্যানোটেশন, যা Java-তে JSON ডেটার সাথে কাজ করার সময় ব্যবহৃত হয়। এগুলো মূলত JSON ডেটা সিরিয়ালাইজেশন (Serialization) এবং ডিসিরিয়ালাইজেশন (Deserialization) প্রক্রিয়াকে নিয়ন্ত্রণ করতে ব্যবহৃত হয়।
1. @JsonProperty
@JsonProperty ব্যবহার করা হয় একটি ফিল্ড বা মেথডের নাম পরিবর্তন করতে অথবা JSON ডেটাতে প্রদর্শনের জন্য কাস্টম নাম নির্ধারণ করতে।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonProperty;
public class User {
@JsonProperty("user_id") // JSON-এ "id" ফিল্ডের নাম হবে "user_id"
private int id;
@JsonProperty("user_name") // JSON-এ "name" ফিল্ডের নাম হবে "user_name"
private String name;
// Getters এবং Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ইনপুট JSON:
{
"user_id": 1,
"user_name": "John Doe"
}
আউটপুট JSON:
{
"user_id": 1,
"user_name": "John Doe"
}
2. @JsonIgnore
@JsonIgnore ব্যবহার করা হয় একটি ফিল্ডকে JSON ডেটার অংশ হতে বাধা দিতে। এটি JSON সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন উভয় ক্ষেত্রেই প্রযোজ্য।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonIgnore;
public class User {
private int id;
@JsonIgnore // JSON ডেটাতে এই ফিল্ডটি অন্তর্ভুক্ত হবে না
private String password;
private String name;
// Getters এবং Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ইনপুট JSON:
{
"id": 1,
"name": "John Doe"
}
আউটপুট JSON:
{
"id": 1,
"name": "John Doe"
}
Note: এখানে
passwordফিল্ডটি JSON ডেটাতে অন্তর্ভুক্ত হবে না কারণ এটি@JsonIgnoreদ্বারা এনোটেট করা হয়েছে।
সংক্ষেপে:
@JsonProperty: ফিল্ড বা মেথডের নাম কাস্টমাইজ করতে ব্যবহৃত হয়।@JsonIgnore: একটি ফিল্ডকে JSON ডেটার বাইরে রাখতে ব্যবহৃত হয়।
এই দুটি অ্যানোটেশন ব্যবহার করে আপনার JSON ডেটার প্রক্রিয়াকরণ আরও সহজ এবং নিয়ন্ত্রণযোগ্য করা যায়।
Jackson একটি জনপ্রিয় Java লাইব্রেরি যা JSON ডেটার Serialization (Java Object থেকে JSON এ রূপান্তর) এবং Deserialization (JSON থেকে Java Object এ রূপান্তর) সহজতর করে। এখানে @JsonInclude এবং @JsonSetter ব্যবহার করে কিভাবে Serialization কাস্টমাইজ করা যায় তা আলোচনা করা হলো।
1. @JsonInclude
@JsonInclude অ্যানোটেশনটি ব্যবহার করা হয় JSON এ কোন কোন প্রোপার্টি অন্তর্ভুক্ত হবে তা নির্ধারণ করতে।
সাধারণ ব্যবহার
import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_NULL) // null মানের প্রোপার্টি বাদ দেওয়া হবে
public class User {
private String name;
private Integer age;
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
ব্যাখ্যা
JsonInclude.Include.NON_NULL: শুধুমাত্র non-null প্রোপার্টি JSON এ অন্তর্ভুক্ত হবে।- অন্যান্য অপশন:
ALWAYS: সব প্রোপার্টি অন্তর্ভুক্ত হবে (default)।NON_EMPTY: null বা খালি ভ্যালু বাদ দেওয়া হবে।NON_DEFAULT: শুধুমাত্র non-default মানের প্রোপার্টি অন্তর্ভুক্ত হবে।
উদাহরণ
User user = new User();
user.setName("John");
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(user);
System.out.println(jsonString); // Output: {"name":"John"}
2. @JsonSetter
@JsonSetter অ্যানোটেশনটি Deserialization এর সময় নির্দিষ্ট প্রোপার্টি সেট করতে কাস্টমাইজড কনফিগারেশন প্রদান করে।
সাধারণ ব্যবহার
import com.fasterxml.jackson.annotation.JsonSetter;
public class User {
private String name;
@JsonSetter("user_name") // JSON এর "user_name" ফিল্ড "name" প্রোপার্টিতে সেট হবে
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
ব্যাখ্যা
@JsonSetterএকটি কাস্টম JSON ফিল্ড ম্যাপ করার জন্য ব্যবহৃত হয়, যা Deserialization এর সময় কাজ করে।
উদাহরণ
String json = "{ \"user_name\": \"Alice\" }";
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);
System.out.println(user.getName()); // Output: Alice
দুইটি একসাথে ব্যবহার
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonSetter;
@JsonInclude(JsonInclude.Include.NON_EMPTY) // খালি ভ্যালু বাদ
public class User {
private String name;
@JsonSetter("user_name") // JSON ফিল্ড ম্যাপ
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
উদাহরণ
String json = "{ \"user_name\": \"Bob\", \"age\": \"\" }";
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);
System.out.println(user.getName()); // Output: Bob
String serializedJson = mapper.writeValueAsString(user);
System.out.println(serializedJson); // Output: {"name":"Bob"}
@JsonIncludeব্যবহার করে আপনি Serialization এর সময় নির্দিষ্ট প্রোপার্টি বাদ দিতে পারেন।@JsonSetterব্যবহার করে Deserialization এর সময় JSON ফিল্ড এবং Java ফিল্ড এর মধ্যে ম্যাপিং কাস্টমাইজ করতে পারেন।- এই অ্যানোটেশনগুলো ডেটা মডেলিং এবং JSON ফর্ম্যাটের উপর নিয়ন্ত্রণ বাড়াতে গুরুত্বপূর্ণ ভূমিকা পালন করে।
Java-তে JSON serialization এবং deserialization কাজ করার জন্য Jackson একটি জনপ্রিয় লাইব্রেরি। @JsonFormat এবং @JsonView দুটি গুরুত্বপূর্ণ Jackson এনোটেশন যা JSON serialization প্রক্রিয়া কাস্টমাইজ করতে ব্যবহৃত হয়।
1. @JsonFormat
@JsonFormat ব্যবহার করা হয় একটি ফিল্ডের ফরম্যাট কাস্টমাইজ করতে। এটি তারিখ এবং সময়, সংখ্যা ইত্যাদির ফরম্যাট নিয়ন্ত্রণ করতে কার্যকর।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Date;
class User {
public String name;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy HH:mm:ss")
public Date registrationDate;
}
public class Main {
public static void main(String[] args) throws Exception {
User user = new User();
user.name = "John Doe";
user.registrationDate = new Date();
ObjectMapper objectMapper = new ObjectMapper();
String jsonOutput = objectMapper.writeValueAsString(user);
System.out.println(jsonOutput);
}
}
আউটপুট:
{
"name": "John Doe",
"registrationDate": "21-12-2024 15:30:00"
}
2. @JsonView
@JsonView ব্যবহার করা হয় বিভিন্ন দৃষ্টিভঙ্গি (views) অনুযায়ী JSON serialization নিয়ন্ত্রণ করতে।
ধাপসমূহ:
- একটি বা একাধিক ভিউ ইন্টারফেস তৈরি করুন।
- @JsonView এনোটেশন দিয়ে ফিল্ড বা মেথডে নির্ধারণ করুন কোন ভিউটি কোন তথ্য দেখাবে।
- ObjectMapper-কে কনফিগার করুন নির্দিষ্ট ভিউ ব্যবহার করার জন্য।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonView;
import com.fasterxml.jackson.databind.ObjectMapper;
class Views {
public static class Public {}
public static class Internal extends Public {}
}
class Product {
@JsonView(Views.Public.class)
public String name;
@JsonView(Views.Internal.class)
public double price;
@JsonView(Views.Public.class)
public String description;
}
public class Main {
public static void main(String[] args) throws Exception {
Product product = new Product();
product.name = "Laptop";
product.price = 1200.99;
product.description = "High performance laptop";
ObjectMapper objectMapper = new ObjectMapper();
// Public view serialization
String publicJson = objectMapper.writerWithView(Views.Public.class).writeValueAsString(product);
System.out.println("Public View: " + publicJson);
// Internal view serialization
String internalJson = objectMapper.writerWithView(Views.Internal.class).writeValueAsString(product);
System.out.println("Internal View: " + internalJson);
}
}
আউটপুট:
Public View: {"name":"Laptop","description":"High performance laptop"}
Internal View: {"name":"Laptop","price":1200.99,"description":"High performance laptop"}
ব্যবহারিক ক্ষেত্র:
- @JsonFormat: তারিখ বা সংখ্যা প্রদর্শনের ফরম্যাট নিয়ন্ত্রণে (যেমন UI বা API রেসপন্সে)।
- @JsonView: API-তে বিভিন্ন ধরনের ক্লায়েন্ট বা ইউজারের জন্য আলাদা তথ্য প্রদর্শনে।
এগুলো ব্যবহার করে JSON serialization কাস্টমাইজ করা আরও সহজ এবং উন্নততর করা সম্ভব।
Java-তে annotations হলো meta-data যা প্রোগ্রাম কোডের বিভিন্ন অংশকে নির্দেশ করতে ব্যবহৃত হয়। এগুলি মূলত কম্পাইলার এবং runtime environment-এর জন্য হালকা ওজনের নির্দেশনা হিসাবে কাজ করে। Custom annotation হলো ডেভেলপারদের দ্বারা তৈরি বিশেষ annotations, যা নির্দিষ্ট প্রয়োজনে কোডে যোগ করা যায়।
Custom Annotations কীভাবে তৈরি করবেন?
Custom annotation তৈরি করতে @interface কীওয়ার্ড ব্যবহার করা হয়। এটি একটি ইন্টারফেসের মতো কাজ করে যা বিভিন্ন meta-data attribute ধারণ করতে পারে।
একটি Custom Annotation এর উদাহরণ:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// Custom Annotation Definition
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface JacksonInfo {
String author();
String version();
}
Explanation:
- @Retention: এই annotation নির্দেশ করে যে annotation টির lifespan কতক্ষণ থাকবে।
RetentionPolicy.RUNTIME: এটি runtime পর্যন্ত থাকবে।RetentionPolicy.CLASS: এটি compile time পর্যন্ত থাকবে।RetentionPolicy.SOURCE: এটি compile এর পরে মুছে যাবে।
- @Target: এটি নির্দেশ করে annotation কোথায় ব্যবহার করা যাবে। যেমন, method, class, field ইত্যাদি।
Custom Annotation প্রয়োগ
উপরের annotation-টি একটি ক্লাস এবং মেথডে প্রয়োগ করা যেতে পারে।
@JacksonInfo(author = "John Jackson", version = "1.0")
public class MyService {
@JacksonInfo(author = "Jane Doe", version = "1.2")
public void execute() {
System.out.println("Executing Service...");
}
}
Custom Annotation প্রক্রিয়া করা (Processing)
Custom annotation ব্যবহার করে runtime-এ এর ডেটা retrieve করার জন্য Reflection API ব্যবহার করা হয়।
import java.lang.reflect.Method;
public class AnnotationProcessor {
public static void main(String[] args) {
try {
// ক্লাস লোড করা
Class<MyService> obj = MyService.class;
// ক্লাস-এ থাকা annotation খুঁজে বের করা
if (obj.isAnnotationPresent(JacksonInfo.class)) {
JacksonInfo info = obj.getAnnotation(JacksonInfo.class);
System.out.println("Class Author: " + info.author());
System.out.println("Class Version: " + info.version());
}
// মেথড-এ থাকা annotation খুঁজে বের করা
for (Method method : obj.getDeclaredMethods()) {
if (method.isAnnotationPresent(JacksonInfo.class)) {
JacksonInfo info = method.getAnnotation(JacksonInfo.class);
System.out.println("Method: " + method.getName());
System.out.println("Author: " + info.author());
System.out.println("Version: " + info.version());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Custom Annotations এর ব্যবহার
- Configuration Management: Custom annotations ব্যবহার করে কনফিগারেশন সংরক্ষণ করা যায়।
- Validation Frameworks: Input validation করতে custom annotations কার্যকর।
- Dependency Injection: Spring বা অন্যান্য frameworks-এ dependency injection এর জন্য custom annotations ব্যবহৃত হয়।
- Logging and Monitoring: Custom annotations ব্যবহার করে logging এবং monitoring এর কাজ স্বয়ংক্রিয় করা যায়।
Custom annotations Java প্রোগ্রামিং-এ উন্নত এবং modular কোডিং এর জন্য অপরিহার্য। এটি কোডকে আরও বেশি সংহত, সংজ্ঞায়িত, এবং পুনর্ব্যবহারযোগ্য করে তোলে।
Read more